package com.onlinewebgames.tictactoe.database;



import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import com.onlinewebgames.tictactoe.config.ConfigConstants;
import com.onlinewebgames.tictactoe.models.LoggedUser;
import com.onlinewebgames.tictactoe.models.Partida;
import com.onlinewebgames.tictactoe.utils.L;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;



public class TicTacToeDAO {

	
	
	private static SQLiteDatabase db;
	private static TicTacToeDAO ticTacToeDAO;
	private static TicTacToeHelper ticTacToeHelper;

	private ResourceBundle rbUser = ResourceBundle
			.getBundle("com.onlinewebgames.tictactoe.database.UserSQL");

	private ResourceBundle rbPartida = ResourceBundle
			.getBundle("com.onlinewebgames.tictactoe.database.PartidaSQL");
	
	//INICIALIZAMOS MEDIANTE SINGLETON ACCESO A BASE DE DATOS
	
	public static void init(final Context ctx)
	{
	    ticTacToeDAO = new TicTacToeDAO(ctx);
		
	}
	
	public static TicTacToeDAO getSingleton()
	{
		return ticTacToeDAO;
	}

	public TicTacToeDAO(final Context ctx)
	{
		ticTacToeHelper = new TicTacToeHelper(ctx, ConfigConstants.nombreBBDD, null, 1);
	}
	
	
	/////////////////////////////////////////////////////////////
	
	
	// ACCESOS A TABLA USER
	
	public boolean changeUser (LoggedUser user) {
		if (getUser() != null) {
			deleteUser();
		}
		return addUser(user);

	}
	
	
    public void deleteUser() {
		
		
		db = ticTacToeHelper.getWritableDatabase();
		
			
			try {
				
				String delete = MessageFormat.format(rbUser.getString("deleteUser"),
						new Object[] { ConfigConstants.nombreTablaUser });
				
				db.execSQL(delete);	
			
			} catch (final Exception e) {
				L.p("Error while deleting user");
				Log.e(ConfigConstants.ERROR, e.getMessage());
			}	
		
		finally {
		if(db != null && db.isOpen()) {
			db.close();
	
		}
		
		}
	
	}
	
    
     public boolean addUser(LoggedUser user) {
		
    	 
        db = ticTacToeHelper.getWritableDatabase();
		

		if(db!=null) {
			
			try {
		
				
				String insertar = MessageFormat.format(rbUser.getString("insertUser"),
						new Object[] { ConfigConstants.nombreTablaUser , 0 ,  user.getUser(), user.getPass(), 
					user.getName() });
				
				db.execSQL(insertar);	
    			
    			db.close();
    			return true;
			
			} catch (final Exception e) {
				L.p("Error while adding new user");
				Log.e(ConfigConstants.ERROR, e.getMessage());//e.printStackTrace()
		
			} finally {
			if(db != null && db.isOpen()) {
				db.close();
			}
			
			}
		}
		
		return false;
	}
    
	
	public LoggedUser getUser() {
		
		db = ticTacToeHelper.getWritableDatabase();
		
		String getUser = MessageFormat.format(rbUser.getString("getUser"),
				new Object[] { ConfigConstants.nombreTablaUser });
		
	
		LoggedUser user = TicTacToeHelper.transformToUser(db.rawQuery(getUser, null));
	
		db.close();
		return user;
		
	}
	
	////////////////////////////////////////////////////////
	
	// ACCESO A TABLA PARTIDA
	
	

	
	public void deletePartida(Partida partida) {
		
		db = ticTacToeHelper.getWritableDatabase();
		
		try {
			
			String delete = MessageFormat.format(rbPartida.getString("deletePartida"),
					new Object[] { ConfigConstants.nombreTablaPartida, partida.getIdPartida() });
			db.execSQL(delete);
						
		} catch (Exception e) {
			L.p("Error while deleting partida");
			Log.e(ConfigConstants.ERROR, e.getMessage());
		}
	
		finally {
		if(db != null && db.isOpen()) {
			db.close();
		}
		
		}
		
	}
	
	
	public void insertPartida(Partida partida) {
		
		db = ticTacToeHelper.getWritableDatabase();
		
				
			try {
		
				String insertar = MessageFormat.format(rbPartida.getString("insertPartida"),
						new Object[] { ConfigConstants.nombreTablaPartida , partida.getEstado(),  
				   partida.getTipoPartida() });
				
				db.execSQL(insertar);	
    			
    			db.close();
    	
			
			} catch (final Exception e) {
				L.p("Error while adding new partida");
				Log.e(ConfigConstants.ERROR, e.getMessage());//e.printStackTrace()
		
			} finally {
			if(db != null && db.isOpen()) {
				db.close();
			}
			
			}
	
	
		
	}
	
	public Partida getPartidaById(int idPartida) {
	
		db = ticTacToeHelper.getWritableDatabase();
		
		String getPartidaById = MessageFormat.format(rbPartida.getString("getPartidaById"),
				new Object[] { ConfigConstants.nombreTablaPartida, idPartida });
		
	
		Partida partida = TicTacToeHelper.transformToPartida(db.rawQuery(getPartidaById, null));
	
		db.close();
		
		return partida;
		
	}
	
	
	public List<Partida> getPartidas() {

    db = ticTacToeHelper.getWritableDatabase();
		
	String getPartidas = MessageFormat.format(rbPartida.getString("getPartidas"),
				new Object[] { ConfigConstants.nombreTablaPartida });
		
	List<Partida> list = new ArrayList<Partida>();
	
	list = TicTacToeHelper.transformToListPartida(db.rawQuery(getPartidas, null));
	
	db.close();
	
	return list;
		

	}
	
	
	public List<Partida> getPartidasByEstadoTipo(String estado, String tipoJuego) {
		
		db = ticTacToeHelper.getWritableDatabase();
		
		String getPartidasByEstadoTipo = MessageFormat.format(rbPartida.getString("getPartidasByEstadoTipo"),
				new Object[] { ConfigConstants.nombreTablaPartida , estado, tipoJuego });
		
		List<Partida> list = new ArrayList<Partida>();
		
		list = TicTacToeHelper.transformToListPartida(db.rawQuery(getPartidasByEstadoTipo, null));
		
		db.close();
		
		return list;
		
	}
	
	
	public boolean changeEstadoPartida(Partida partida, String nuevoEstado) {
	

		db = ticTacToeHelper.getWritableDatabase();
		
		String changeEstadoPartida = MessageFormat.format(rbPartida.getString("changeEstadoPartida"),
				new Object[] { ConfigConstants.nombreTablaPartida, partida.getIdPartida(), nuevoEstado });
		
		db.execSQL(changeEstadoPartida);	

		db.close();
		
		return true;
		
		
	}
	
	
	///////////////////////////////////////////////////////
	
}
